package com.mango.DateProcess;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 直接运行main方法就可以了
 * 但是要修改的那个文件不能被其他程序占用，否则可能会报异常
 * 只能使用最原始版本的文件来执行此程序，经过修改的文件格式对不上代码中的参数设置，会导致一些错误格式生成
 */
public class ProcessCSVFile {
    public static void main(String[] args) throws IOException {
        //可以指定一个子文件夹中的父路径，然后遍历该父路径下的所有数据子文件 如 d:/files
        File directory = new File("d:/files");
        for (File file :
                directory.listFiles()) {
//            if (file.isFile()) {
//                //要插入的列值
//                String insertValue =file.getName();
//                //要插入的列的header的名称
//                String headerName = "新添表头2";
//                //要修改的文件完整路径  如　d:/test.csv
////                File file = new File("d:/data1.csv");//指定路径
//                inserCols(0, insertValue, headerName, file);
//            }else if(file.isDirectory()){
//                String inserValue=file.getName();
            String insertValue = file.getName();
            String headerName = "新添表头2";
            File csvPath = new File("...../*.csv");
            inserCols(0, insertValue, headerName, csvPath);
//            }

        }

/*

        //要插入的列值
        String insertValue = "abcabc";
        //要插入的列的header的名称
        String headerName = "新添表头2";
        //要修改的文件完整路径  如　d:/test.csv
        File file = new File("d:/data1.csv");//指定路径
        inserCols(0, insertValue, headerName, file);

*/

    }

    public static String LineaddItem(int index, String originData, String insertValue) {
        List<String> hedersList = new ArrayList<>(Arrays.asList(originData.split(",")));
        hedersList.add(index, insertValue);
        StringBuilder sb = new StringBuilder();
        for (String s :
                hedersList) {
            sb.append(s);
            sb.append(",");
        }
        sb.deleteCharAt(sb.lastIndexOf(","));
        return sb.toString();
    }


    /**
     * @param index       控制要插的列在哪个位置，下边从0开始
     * @param insertValue 要插入的值
     * @param headerValue 增加的表头的值
     * @throws IOException
     */
    public static void inserCols(int index, String insertValue, String headerValue, File oFile) throws IOException {
        String tmpName = oFile.getParent() + "tmp.csv";
        File tmpFile = new File(oFile.getPath());
        oFile.renameTo(new File(tmpName));

        File oriFile = new File(tmpName);
        FileReader fr = new FileReader(oriFile);
        FileWriter fw = new FileWriter(tmpFile);
        BufferedWriter bw = new BufferedWriter(fw);
        BufferedReader br = new BufferedReader(fr);
        String line = null;//已经读取了第一行
        int flag = 2;//
        boolean isHeader = true;
        while ((line = br.readLine()) != null) {
            //控制表头的偏移量
            if (flag == 2) {
                flag--;
                continue;
            } else if (flag == 1 && isHeader) {
                //设置新增列的表头的值
                String newLine = LineaddItem(index, line, headerValue);
                bw.write(newLine + "\r\n");
                isHeader = false;
                flag--;
                continue;
            }
            if (flag > 0) flag--;
            String newLine = LineaddItem(index, line, insertValue);
            bw.write(newLine + "\r\n");
        }
        bw.flush();
        fw.close();
        br.close();
        oriFile.delete();
    }
}
